package zwp.exercise.service.exercisedemo.chapterThree.basicdatatypes;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

import static zwp.exercise.service.exercisedemo.chapterThree.basicdatatypes.BMIexponent.fetchFinalEvaluation;

/**
 * @Author zwp14
 * @create 2025/9/28 21:33
 * @description 再次练习
 */
public class BMIexpomemtReview {

    /**
     * BMI-瘦-阈值
     */
    private static final double THIN_CONSTANT = 18.5d;
    /**
     * BMI-正常-阈值
     */
    private static final double COMMON_CONSTANT = 24.9d;
    /**
     * BMI-肥胖-阈值
     */
    private static final double FAT_CONSTANT = 29.9d;

    private static final String YES = "Y";
    private static final String NO = "N";

    /**
     * 现时
     */
    private static final Long LIMIT_TIME = 10000L;

    /**
     * 用户输入值范围
     */
    static List<String> list = Arrays.asList(YES,NO);
    /**
     * 用户输入次数，暂不考虑
     */
    static int countTimes = 0;

    /**
     * 用户最后一次操作时间
     */
    static AtomicLong lastActivityTime = new AtomicLong(System.currentTimeMillis());

    /**
     * 主程序
     * @param args 参数
     */
    public static void main(String[] args) {

        System.out.println("即将开始BMI评价，如长时间未进行操作，系统将自动关闭！");

        // 创建一个用户操作监听器，若是长时间未进行操作，将自动终止程序
        ScheduledExecutorService scheduledExecutorService = startBizControl();

        // 创建一个系统输入，并且  若用户一直输入，将不停进行BMI评价。停止方法，用户输入N，或者长时间不操作
        try (Scanner scanner = new Scanner(System.in)) {
            do {
                // 请输入您的身高
                System.out.println("请输入您的身高(cm):");
                double height = scanner.nextDouble() / 100;
                restLastActivityTime();

                // 请输入您的体重
                System.out.println("请输入您的身高(kg):");
                double weight = scanner.nextDouble();
                restLastActivityTime();

                // 获取BMI指数
                double exponent = getExponent(height, weight);

                // 获取最终建议
                fetchFinalEvaluation(exponent);

            } while (fetchUserInput(scanner).equalsIgnoreCase(YES));

        } finally {
            // 当用户输入N时，直接结束程序。
            System.out.println("成功退出系统！可参考建议合理饮食，具体依线下就医为准！谢谢使用！");
            scheduledExecutorService.shutdown();
        }

    }

    /**
     * 重置用户最后一次操作时间
     */
    private static void restLastActivityTime() {
        lastActivityTime.set(System.currentTimeMillis());
        System.out.println("重置用户最后一次操作时间！");
    }

    /**
     * 开启用户操作定时检查
     * @return 定时检查线程
     */
    private static ScheduledExecutorService startBizControl() {

        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        scheduledExecutorService.scheduleAtFixedRate(()->{
            long time = System.currentTimeMillis() - lastActivityTime.get();
            if (time >= LIMIT_TIME){
                System.out.println(time/1000+"秒内用户未操作，系统自动关闭！");
                scheduledExecutorService.shutdown();
                System.exit(0);
            }
        },1,1, TimeUnit.SECONDS);
        return scheduledExecutorService;
    }

    /**
     * 获取用户输入值
     * @param scanner 系统输入
     * @return 用户输入值
     */
    private static String fetchUserInput(Scanner scanner) {
        while (true){
            System.out.println("是否改变身高体重数值再次进行评估？Y/N");
            String input = scanner.next();
            restLastActivityTime();
            if (list.contains(input)){
                return input;
            }
            System.out.println("输入非法，请再次尝试输入Y或者N！");
        }
    }

    /**
     * 获取BMI指数
     * @param height 身高
     * @param weight 体重
     * @return BMI指数
     */
    private static double getExponent(double height, double weight) {
        // 计算BMI指数
        double exponent = weight / (height * height);
        System.out.println("您的身高为：" + height * 100 + "cm");
        System.out.println("您的体重为：" + weight + "kg");
        System.out.println("您的BMI指数为：" + exponent);
        return exponent;
    }

}
